<?php
/**
 * Created by PhpStorm.
 * User: GZJ
 * Date: 2017/5/17
 * Time: 16:24
 */

namespace Admin\Controller;


//use think\Controller;
header('content-type:text/html;charset=utf8');
class GoodsController extends BaseController{

    /****************商品库存量*******************/
    public function goods_number(){
        $id = I('get.id');                    //商品id
//        echo $id;die;
        $gnModel = D('goods_number');             //库存量的模型

        if(IS_POST){
            /********************库存量更新的时候可以先删除数据库的信息 再把商品的库存量添加进去新的  这样就和更新是一样的效果，注意在id可变的去情况下（就是另一个数据库不用这个表的id的时候）*******************************/
            $gnModel ->where(array(
                'goods_id'=>array('eq',$id),
            ))->delete();
            $gn = I('post.goods_number');                  //得到库存量 数组
            $gaid = I('post.goods_attr_id');                     //得到属性的id 数组
            //怎么样循环插入数组？  解决方法 先计算商品属性id 是库存量  长度 的几倍
            $gaCount = count($gaid);
            $gnCount = count($gn);
            $rate = $gaCount/$gnCount;  //得到商品属性和库存量长度的倍数
             $gnModel = D('goods_number');             //库存量的模型
            $_i = 0;
            foreach($gn as $v){
                //循环库存量来添加到库存量表中 难点就是怎么把商品的属性id 也加进去
                $goodsattrid = array();
                for($i=0;$i<$rate;$i++){
                    $goodsattrid[] = $gaid[$_i];  //循环一次 从商品属性数组里取一个数 从$_i取  去一次$_i加1  表示取商品属性id这个数组的第几个值！
                    $_i++;
                }

                //必须要把商品属性id做一个排序 后台怎么排序 前台也必须要怎么排序 保证一致
                sort($goodsattrid,SORT_NUMERIC);//第二个参数表示以数字方式排序
                //最后把取出来的商品属性id这个数组 转换为字符串存在数据库中
                $goods_attr_id = (string)implode(',',$goodsattrid);          //强制转换为字符串string
//                var_dump($goods_attr_id);die();            以上没毛病
                $gnModel->add(array(
                    'goods_id'=>$id,
                    'goods_attr_id'=>$goods_attr_id,
                    'goods_number'=>$v,
                ));
            }
            $this->success('设置成功',U('goods_number?id='.$id));
            exit;
        }

        /*************在库存量方面 如果点击这个商品有库存量就直接显示  如果没有就显示下面的表单添加库存量***********/
       $gnData =  $gnModel->where(array(
            'goods_id'=>$id,
        ))->select();
             foreach($gnData as $v){
                 $aid= $v['goods_attr_id'];
            }
        $attr_id = explode(',',$aid);                      //商品属性id转换为数组
//        var_dump($attr_id);die;
        /************************添加库存量************************/
        $gaModel = D('goods_attr');
        $gaData = $gaModel->alias('a')
            ->field('a.*,b.attr_name')
            ->join('LEFT JOIN __ATTRIBUTE__ b ON a.attr_id = b.id')
            ->where(array(
            'a.goods_id'=>array('eq',$id),
                'b.attr_type'=>array('eq','可选'),
        ))->select();//取出传过来的id对应的属性 在属性列表中查找商品id

        //重要一步 把二维转三维 目的就是把想同的属性放到一个数组里
        $_gadata = array();
        foreach($gaData as  $v){
            $_gadata[$v['attr_name']][]=$v;              //转换为三维数组 把属性的名称作为一个数组  就等于是属性名称作为下标
            // 把取出来的数据存放到里面去 不一样的属性名称 会自动分开
            //$v[attr_name] 中有 颜色 系统 品牌 故会以系统 颜色 品牌为组 当做三维数组的二维的下标 再把$v的所有对应属性存放到这个下标下面
        }

        /***********判断已经添加的库存量和显示在页面上*******************/


//        echo '<pre>';
//        var_dump($gaData);die();
        $gaCou = count($_gadata);
        $this->assign('gaData',$_gadata);
        $this->assign(array(
            'attr_id'=>$attr_id,
            'gnData'=>$gnData,
            'gaCou'=>$gaCou,
            '_page_btn_name'=>'库存量',
            '_page_title'=>'换回列表',
            '_page_btn_link'=>U('Goods/lst'),
        ));
        $this->display();

    }


    /*********************处理ajax的请求*********************/
    public function ajaxGetAttr(){
        $typeId = I('get.type_id');
        //传过来的类型id 在属性表中查找对应的类型id的属性
        $attrModel = D('Attribute');
       $attrData =  $attrModel->where(array(
            'type_id'=>array('eq',$typeId),
        ))->select();
        echo json_encode($attrData);
    }

    /*****************删除ajax发送来对应id的属性 在商品属性表中****************/
    public function ajaxDelete(){
        $ga_id = I('get.gaid');          //属性id
        $gaModel = D('goods_attr');     //商品属性表
        //第一种删除方法
        $gaModel->delete($ga_id);
        //第二种删除方法
//        if($ga_id){
//            $gaModel->where(array(
//                'id'=>array('eq',$ga_id)
//            ))->delete();
//        }

        /******************在ajax获取到商品属性id 删除商品属性id后 同时这里也删除对应的属性id的库存量********************/
        //重点 where怎么写条件 不会删除其他含所有相同id的
        $goods_id=addslashes(I('get.goods_id'));//防sql注入
        $gnModel = D('goods_number');                         // 商品库存表
        $gnModel->where(array(
            'goods_id'=>array('EXP',"=$goods_id AND FIND_IN_SET($ga_id,goods_attr_id)"),
            //  EXP 在tp里表示可以写一个php的表达式在里面 因为find——in——set 不能再tp里直接用
            //  商品id等于传过来的商品的id  并且 这个商品的属性id有在这个字段里 条件都成立 可以删除
        ))->delete();
    }
    public function add(){

        if(IS_POST){
//            echo '<pre>';
//            var_dump($_POST);die;

            $model = D('Goods');
            //creat 方法作用第一个参数默认要是接收数据是$_post
            //第二个参数是表单类型 1为添加 2为修改 告诉模型层是修改还是添加
            //creat 起到了俩个作用 一个是接收数据 和保存数据到模型中  第二个是验证表单
           if($model->create(I('post.'),1)){
               //添加到数据库
//               $time = date('Y-m-d H:i:s',time());   //或者用model里的一个钩子函数方法 来设置时间
//               $model->addtime = $time;
               if($model->add()){
                   //添加成功后 提示信息 并等待1秒后跳转回列表  默认1秒 要想长时间 在success 加第三个参数
                   $this->success('添加成功',U('lst'));
                   exit;
               }
           }
            //从模型中取出错误信息
            $error = $model->getError();
            //从控制器中显示错误信息
            //如果有错误 显示错误信息 第一个参数是错误信息 第二个是跳转地址（不写地址 默认跳转到上一层） 第三个是时间  默认3秒
            $this->error($error);
        }

        /********显示表单之前 取出品牌表里的所有信息 放在下拉框中**************/
        $brandModel = D('brand');
        $brandData = $brandModel->select();
        //设置页头页脚信息

        /*********在商品添加之前 查出所有会员级别 并显示在添加的表单里*******************/
        $mlModel = D('MemberLevel');
        $mlData = $mlModel->select();
        /***************商品分类信息**************************/
        $catmodel = D('Category');
        $catdata = $catmodel->getTree();
//        foreach($catdata as $v ){ echo $v['cat_name'].'<br/>';}die();
        /*****************商品类型属性信息***************/
        $gaModel = D('type');
        $tylist = $gaModel->select();
        $this->assign(array(
            'tylist'=>$tylist,
            'catdata'=>$catdata,
            'mlData' => $mlData,                              //取出会员级别信息匹配信息放在数组中 然后显示在模板中
            'brandData'=>$brandData,                         //取出品牌信息放在数组中 然后显示在模板中
            '_page_btn_name'=>'商品列表',
            '_page_title'=>'-添加商品',
            '_page_btn_link'=>U('Goods/lst'),
        ));
        $this->display();
    }


    /*
     * 商品修改
     * 和添加基本上相同
     */
    public function edit(){
//        echo '<pre>';
//        var_dump($_POST);die();
        $id = I('get.id');                        //隐藏域的商品id
//        echo $id;
        $model = D('Goods');
        if(IS_POST){
            if($model->create(I('post.'),2)){
                if(FALSE !== $model->save()){     //返回值有俩中情况 如果失败就返回false
                    // 如果成功返回受影响条数【如果修改后和改签相同就返回0 】 这句意思 只要不返回false 就表示成功了
                    $this->success('修改成功',U('lst'));
                    exit;
                }
            }
            $error = $model->getError();
            $this->error($error);
        }
        //修改信息时 拿到对应的id取出对应的信息 放到表单中
//        find() 查询出来是一维数组
//        select 查询出来是二维的数组
//        $data = $model->where(array('id'=>$id))->select();
//        $dataa = array();
        $data = $model->find($id);
//        echo $data['brand_id'];die;  得到 id=1
//        $dataa[] = $data;
//        echo '<pre>';
//        print_r($data);exit;
        /************商品修改里获得所有分类信息**************/
        $catmodel = D('category');
        $catdata = $catmodel->getTree();
        /********显示表单之前 取出品牌表里的所有信息 放在下拉框中**************/
        $brandModel = D('brand');
        $brandData = $brandModel->select();
//        echo  $brandData[0]['id'];die;

        /****************取出拓展分类的ID********************************/
        $gcModel = D('goods_cat');
        $gcdata = $gcModel->field('cat_id')->where(array('goods_id'=>array('eq',$id)))->select();
//        var_dump($gcdata);die();
        //因为拓展分类没有取出来  取出来后 不能搜索 所以暂时不用这个功能
        /*****************商品类型属性信息***************/
        $gaModel = D('type');
        $tylist = $gaModel->where()->select();
        /*****************取出这件商品已经设置了的属性信息*****
        //先找到当前修改id的商品 打印出来看 再链表查商品属性表和类型表 、属性表
        $gaModel = D('goods_attr');
        $gaData = $gaModel
            ->alias('a')
            ->field('a.*,b.attr_name,b.attr_type,b.attr_option_values')
            ->join('LEFT JOIN __ATTRIBUTE__ b ON a.attr_id=b.id')
            ->where(array(
            'a.goods_id'=>array('eq',$id),
        ))->select();                              //where语句是查找当前传过来的商品id 和属性表里的id是不是医院的 是一样的就把所有和当前传过来的id相同的属性都找出来
         * *******************/

        /**************************解决在当前类型下新添加属性时取不出来的情况*******************/
        //先取出当前类型下所有的属性
        $attrModel = D('Attribute');
        $gaData = $attrModel
            ->alias('a')
            ->field('a.*,b.attr_value,b.attr_id,b.id goods_attr_id')
            ->join('LEFT JOIN __GOODS_ATTR__ b ON a.id = b.attr_id AND b.goods_id = '.$id.'')
            ->where(array(
                'a.type_id'=>array('eq',$data['type_id']),
            ))->select();                                                                             //where语句是查找当前传过来的商品type_id 等于属性表里的类型id
//        echo '<pre>';
//        var_dump($gaData);die();
        $select = "";
        $attrid = array();
        foreach($gaData as $v1){
//            echo '<pre>';
//            var_dump( $v1['id']);die();                                                              //获取颜色选项信息
            if(in_array($v1['attr_id'],$attrid)){                                                     //如果这个属性id存在这个数组内 就是-号
                $opt = '[-]';
            }else{
                $opt = '[+]';
                $attrid[] = $v1['attr_id'];                                                            //如果没有就是+号 并且把这个id放到这个数组内 后面判断
            }
            if($v1['attr_type']=="可选"){
                $select.='<li>';
                $select.='<input name="goods_attr_id[]" type="hidden" value="'.$v1['goods_attr_id'].'"/>';
                $select.='<a onclick="addNewAttr(this)">'.$opt.'</a>';
                $select.=  $v1['attr_name'].':';
//                    echo '<pre>';
//                    var_dump($attr);
                $id = $v1['id'];
                $select.='<select name="attr_value['.$id.'][]"><option value="">请选择...</option>';
                if($v1['attr_option_values']){
                    $attr = explode(',',$v1['attr_option_values']);
//                    echo '<pre>';
//                    var_dump($v1);
                    foreach($attr as $vv){
                        if($vv == $v1['attr_value']){                                               //判断选择状态
                            $select.='<option selected="selected" value=" '.$vv.'">'.$vv.'</option>';
                        }else{
                            $select.='<option value="'.$vv.'">'.$vv.'</option>';
                        }
                    }
                        $select.='</select>';
                }
            }else{
                $id = $v1['id'];
                $select.= $v1['attr_name'].':';
                $select.='<input name="goods_attr_id[]" type="hidden" value="'.$v1['goods_attr_id'].'"/>';
                $select.='<input name="attr_value['.$id.'][]" type="text" value="'.$v1['attr_value'].'" size="11px;"/>';
            }
            $select.='</li>';
        }



        $this->assign(array(
            'select'=>$select,
            'gaData'=>$gaData,
            'tylist'=>$tylist,
            'catdata'=>$catdata,
            'brandData'=> $brandData,
            'gcdata'=>$gcdata,
            '_page_btn_name'=>'商品列表',
            '_page_title'=>'-修改信息',
            '_page_btn_link'=>U('Goods/lst'),
        ));

        $this->assign('data',$data);
        $this->display();
    }




    //商品列表
    public function lst(){
   /*     $goods_nm =I('get.gn');
        $this->assign('goods',$goods_nm);
        次方法和在html里面写上“     <?php echo I('get.gn'); ?>   ”是一样的效果
   */
        $model = D('goods');
        //返回数据和翻页 三维数组
       $data =  $model->search();
//        echo '<pre>';
//        print_r($data);exit;
        //search 方法return回来的
        $this->assign('data',$data);
        /********取出分类信息分类模型的递归函数 搜索用*************/
        $catmodel = D('category');
        $catdat = $catmodel->getTree();
        $cat_id = I('get.cat_id');
//        echo $cat_id;die;

        $this->assign(array(
            'cat_id'=>$cat_id,
            'catdat'=>$catdat,
            '_page_btn_name'=>'添加商品',
            '_page_title'=>'-商品列表',
            '_page_btn_link'=>U('Goods/add'),
        ));
//        echo '<pre>';
//        var_dump($data);die;
       $this->display();
    }



    /*
     * 删除商品
     */

    public function delete(){
        $id = I('get.id');
        $Model = D('Goods');
        if($id){
           if(FALSE !== $Model ->delete($id)){
            $this->success('删除成功',U('lst'));     //删除成功返回列表页
           }else{
               $this->error('删除失败！ 原因：'.$Model->getError());  //失败原因返回模型中的错误提示
           }
        }
    }
}